using System;
using System.Linq;
using System.Collections.Generic;
using System.Transactions;

using PMServiceDesk.DataType;
using PMServiceDesk.DataAccess;
using PMServiceDesk.Utils.ManejoDatos;
using PMServiceDesk.Parameters.Constantes;

namespace PMServiceDesk.BusinessLogic
{
    public class ProyectoLogic
    {
        #region Variables

        private ProyectoData _proyectoData;

        #endregion

        #region Constructores

        public ProyectoLogic()
        {
            _proyectoData = new ProyectoData();
        }

        #endregion

        #region Metodos

        public ProyectoType CargarPorId(string id)
        {
            _proyectoData.FiltrarPorId(id);

            return _proyectoData.Cargar();
        }

        public void Grabar(ProyectoType proyecto)
        {
            using (TransactionScope transaccion = new TransactionScope())
            {
                _proyectoData.Grabar(proyecto);

                this.DefaultConfiguracion(proyecto);

                transaccion.Complete();
            }
        }

        public void RegistrarFechasLineaBase(string proyectoId, List<LineaBaseImportarType> importacion)
        {
            ProyectoType proyecto = this.CargarPorId(proyectoId);

            proyecto.FechaInicioEstimado = (
                                                from registro in importacion
                                                orderby ConvertFormat.Char_To_Date(registro.FechaInicio) ascending
                                                select registro
                                            ).First().FechaInicio;

            proyecto.FechaFinEstimado = (
                                            from registro in importacion
                                            orderby ConvertFormat.Char_To_Date(registro.FechaInicio) descending
                                            select registro
                                        ).First().FechaFin;

            _proyectoData.Grabar(proyecto);
        }

        public void DefaultConfiguracion(ProyectoType proyecto)
        {
            CalendarioLogic logicCalendario = new CalendarioLogic();

            CalendarioType calendario = logicCalendario.CargarPorProyecto(proyecto.Id,Parametros.Calendario_General);

            if (calendario == null)
            {
                calendario = new CalendarioType();

                calendario.Id = "0";
                calendario.ProyectoId = proyecto.Id;
                calendario.Nombre = Parametros.Calendario_General;
            }

            calendario.Habilitado = true;

            logicCalendario.Grabar(calendario);

            proyecto.CalendarioId = calendario.Id;

            RecursoLogic logicRecurso = new RecursoLogic();

            logicRecurso.RegistrarRecursoJefeProyecto(proyecto);
        }

        public List<ProyectoType> CargarExploradorPaginado(ProyectoType registroBusqueda, int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _proyectoData.FiltrarPorUsuarioJefeProyectoId(registroBusqueda.UsuarioJefeProyectoId);
            if (registroBusqueda.EstadoId != "") _proyectoData.FiltrarPorEstadoId(registroBusqueda.EstadoId);
            if (registroBusqueda.OrigenId != "") _proyectoData.FiltrarPorOrigenId(registroBusqueda.OrigenId);
            if (registroBusqueda.Nombre != "") _proyectoData.FiltrarPorNombre(registroBusqueda.Nombre);

            if (registroBusqueda.TipoBusquedaFecha != "" && registroBusqueda.FechaInicioEstimado != "" && registroBusqueda.FechaFinEstimado != "")
            {
                DateTime fechaDesde = ConvertFormat.Char_To_Date(registroBusqueda.FechaInicioEstimado);
                DateTime fechaHasta = ConvertFormat.Char_To_Date(registroBusqueda.FechaFinEstimado).AddDays(1);

                switch (registroBusqueda.TipoBusquedaFecha)
                {
                    case TipoBusqueda.Proyecto_FechaInicioEstimado:
                        _proyectoData.FiltrarPorFechaInicioEstimado(fechaDesde, fechaHasta);
                        break;
                    case TipoBusqueda.Proyecto_FechaFinEstimado:
                        _proyectoData.FiltrarPorFechaFinEstimado(fechaDesde, fechaHasta);
                        break;
                    case TipoBusqueda.Proyecto_FechaInicioReal:
                        _proyectoData.FiltrarPorFechaInicioReal(fechaDesde, fechaHasta);
                        break;
                    case TipoBusqueda.Proyecto_FechaFinReal:
                        _proyectoData.FiltrarPorFechaFinReal(fechaDesde, fechaHasta);
                        break;
                }
            }

            return _proyectoData.CargarListaVista(paginaActual,cantidadMostrar,orderBy);
        }

        #endregion
    }
}
